{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 多层感知机 (Multi-Layer Perceptron, MLP)\n",
    "## 3.1 基本概念\n",
    "多层感知机（MLP）是一种前馈神经网络，它包含一个输入层、一个或多个隐藏层和一个输出层。与基本的感知机模型不同，MLP 的每个神经元都使用一个非线性激活函数，如 Sigmoid 或 ReLU。这使得 MLP 能够学习并表示非线性函数，从而处理更复杂的任务。\n",
    "## 3.2 关键技术\n",
    "MLP 的关键技术包括权重、偏置、激活函数和反向传播算法。\n",
    "权重和偏置：权重是用来控制输入特征对输出结果的影响程度，偏置是用来控制当所有输入特征都为零时的输出值。\n",
    "激活函数：激活函数是用来引入非线性的，常见的激活函数有 Sigmoid、Tanh 和 ReLU 等。\n",
    "反向传播算法：反向传播算法是用来更新权重和偏置的，它通过计算损失函数对权重和偏置的梯度来更新权重和偏置。\n",
    "## 3.3 应用领域\n",
    "MLP 广泛应用于各种机器学习任务，包括分类、回归、聚类等。\n",
    "## 3.4 优点\n",
    "MLP 的主要优点是可以处理非线性问题，适用于各种类型的数据，如数值数据、类别数据、文本数据和图像数据等。\n",
    "## 3.5 缺点\n",
    "MLP 的主要缺点是可能会遇到梯度消失或梯度爆炸问题，特别是当网络层数较多时。此外，MLP 需要大量的数据和计算资源来训练。\n",
    "## 3.6 实例分析\n",
    "MLP 是许多更复杂的神经网络模型的基础，如卷积神经网络（CNN）、循环神经网络（RNN）和深度信念网络（DBN）等。\n",
    "## 3.7 手动实现\n",
    "以下是一个简单的 MLP 的 Python 实现："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "\n",
    "def sigmoid(x):\n",
    "    return 1 / (1 + np.exp(-x))\n",
    "\n",
    "def sigmoid_derivative(x):\n",
    "    return x * (1 - x)\n",
    "\n",
    "class MLP:\n",
    "    def __init__(self, x, y):\n",
    "        self.input = x\n",
    "        self.weights1 = np.random.rand(self.input.shape[1], 4) \n",
    "        self.weights2 = np.random.rand(4, 1)                 \n",
    "        self.y = y\n",
    "        self.output = np.zeros(self.y.shape)\n",
    "\n",
    "    def feedforward(self):\n",
    "        self.layer1 = sigmoid(np.dot(self.input, self.weights1))\n",
    "        self.output = sigmoid(np.dot(self.layer1, self.weights2))\n",
    "\n",
    "    def backprop(self):\n",
    "        d_weights2 = np.dot(self.layer1.T, (2*(self.y - self.output) * sigmoid_derivative(self.output)))\n",
    "        d_weights1 = np.dot(self.input.T,  (np.dot(2*(self.y - self.output) * sigmoid_derivative(self.output), self.weights2.T) * sigmoid_derivative(self.layer1)))\n",
    "\n",
    "        self.weights1 += d_weights1\n",
    "        self.weights2 += d_weights2"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**补充:**\n",
    "\n",
    "前馈神经网络（Feedforward Neural Networks，FNN）和多层感知机（Multi-Layer Perceptron，MLP）之间的关系非常紧密，实际上，它们可以被视为几乎相同的概念。<br/>\n",
    "前馈神经网络（FNN）是一种基本的神经网络结构，它的信息流只能向前，不能形成闭环。这种网络包括一个输入层、一个或多个隐藏层和一个输出层。每一层都由多个神经元组成，每个神经元都与下一层的所有神经元相连。<br/>\n",
    "多层感知机（MLP）实际上就是一种特殊的前馈神经网络。它包含一个输入层、一个或多个隐藏层和一个输出层。与基本的感知机模型不同，MLP 的每个神经元都使用一个非线性激活函数，如 Sigmoid 或 ReLU。这使得 MLP 能够学习并表示非线性函数，从而处理更复杂的任务。<br/>\n",
    "所以，你可以将 MLP 视为 FNN 的一个特例，或者说，MLP 是 FNN 的一种具体实现方式。<br/>"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "notes",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
